<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // this 函数内置关键词  => 一般指向一个对象
    // 一般情况下  (普通函数(命名函数 和 匿名函数))  指向window


    // 普通函数
    // String()
    // Number()
    // Boolean()

    // 作为构造函数
    // new String()
    // new Number()
    // new Boolean()
    // 所谓构造函数  =  new + 函数;


    // new 关键词做了哪些操作?
    // (1) 函数执行之初 创建了一个纯净的对象    {}  instanceof fn
    // (2) 强制将this指向该对象      this instanceof fn
    //     构造函数中的this  执行构造函数在执行过程中创建的实例化对象
    // (3) 给每一个实例化对象 绑定__proto__属性 指向构造函数的prototype
    // (4) 返回创建的实例化对象  return this;

    // 注意: 为了区分普通函数和构造函数  要求构造函数首字母大写


    // function fn() {
    //     // {}
    //     console.log(this, this instanceof fn);  // this -> {}
    //     // return this;
    // }
    // //  作为普通函数调用
    // // var result = fn();
    // // console.log(result);


    function Fn() {
        // {}
        console.log(this);  // this -> {}    , this instanceof Fn  => true
        // this.__proto__ = Fn.prototype
        // return this;
    }

    // 作为构造函数调用
    var result = new Fn();  // 调用构造函数(执行构造函数的上下文) => 得到一个实例化对象 => 赋值给变量result 
    console.log("result", result, result instanceof Fn); // {}
    console.log(result.__proto__ === Fn.prototype);




</script>

</html>